package com.example.user.service.impl;

import com.alibaba.cloud.commons.lang.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.user.entity.User;
import com.example.user.mapper.UserMapper;
import com.example.user.api.UserDTO;
import com.example.user.service.UserService;
import org.springframework.beans.BeanUtils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    // 密码加密
    private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();


    /**
     * 创建用户模块
     * 权限组 0 创建界面-任何用户都可以创建角色
     * 1 个方法
     */
    @Override
    public boolean createUser(UserDTO userDTO) {
        String msg = "创建用户-createUser"; //用于日志/信息提示

        //UserDTO name password 不能为空
        if (StringUtils.isEmpty(userDTO.getUsername()) || StringUtils.isEmpty(userDTO.getPassword())) {
            throw new RuntimeException(msg +"用户名或密码不能为空");
        }

        User user = new User();

        //用户name存在 则创建失败抛出异常
        //竞态下 自定义 或 数据库 可能会抛出异常
        //自定义异常处理
        user.setUsername(userDTO.getUsername());
        if(existsByUsername(userDTO.getUsername())){
            throw new RuntimeException(msg +"用户名已存在");
        }


        user.setPassword(passwordEncoder.encode(userDTO.getPassword())); // 加密密码

        //非必要参数
        user.setEmail(userDTO.getEmail());
        user.setAge(userDTO.getAge());

        try
        {
            return save(user); //原有创建逻辑
        } catch (Exception e)  // 数据库约束异常
        {
            // 处理数据库约束异常
            if (e.getCause() instanceof java.sql.SQLIntegrityConstraintViolationException) {
                throw new RuntimeException(msg + "用户名已存在-SQL");
            }
            throw e;
        }

        //return save( user);
    }

    /**
     * 更新用户模块
     * 1 个方法
     * 逻辑：根据jwt全局过滤器 解析token携带信息 锁定唯一id，修改其余提供的信息
     **/
    @Transactional
    @Override
    public boolean updateUser(UserDTO userDTO) {
        String msg = "更新用户-updateUser";

        //获取原用户数据

        // 先从数据库获取现有用户信息
        User existingUser = getById(userDTO.getId());  //检查userdto 中的ID 用户是否存在
        if (existingUser == null) {
            throw new RuntimeException(msg+"用户不存在-id");
        }

        //修改逻辑，修改非空字段信息
        // username
        if (userDTO.getUsername() != null ) // 判断username字段是否为空
        {
            // 检查新用户名是否已存在
            if (existsByUsername(userDTO.getUsername())) {
                throw new RuntimeException(msg+"用户名已存在");
            }
            existingUser.setUsername(userDTO.getUsername());
        }

        // 密码
        if (userDTO.getPassword() != null) {
            existingUser.setPassword(passwordEncoder.encode(userDTO.getPassword()));
        }

        //其他属性
        if (userDTO.getEmail() != null) {
            existingUser.setEmail(userDTO.getEmail());
        }

        if (userDTO.getAge() != null) {
            existingUser.setAge(userDTO.getAge());
        }

        return updateById(existingUser);
    }

    /**
     * 删除用户模块
     * 2 个方法
     */

    //软删除
    @Override
    @Transactional
    public boolean deleteUser(Long userId) {
        return removeById(userId); //mybatis-plus 软删除逻辑 delete 字段置为1删除 0存在
    }

    //硬删除 建议数据库操作
//    @Override
//    public boolean softdeleteUser(Long userId)
//    {
//        String msg = "软删除-封禁-softdeleteuser";
//        User existingUser = getById(userId); //提供id 获取用户信息
//
//        //判断用户是否存在
//        if (existingUser == null) {
//            throw new RuntimeException(msg+"用户不存在");
//
//        }
//        existingUser.setDeleted(0); //0表示删除状态
//        return updateById(existingUser); //修改逻辑 错误语句
//
//    }

    /**
     * 查询用户模块
     * 逻辑：sql id name 字段唯一且不为空
     * 3 个方法
     */

    //根据ID查询用户
    @Override
    public UserDTO getUserById(Long userId) {
        User user = getById(userId); //mybatis- plus逻辑 delete字段为1 查询不到信息
        //System.out.println("查询到的用户：" + (user == null ? "null" : user.toString()));
        if (user == null) {
            return null;
        }
        UserDTO userDTO = new UserDTO();
        BeanUtils.copyProperties(user, userDTO);
        return userDTO;
    }
    //根据name查询用户
    @Override
    public UserDTO getUserByName(String name) {
        //创建查询条件
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", name);
        User user = getOne(queryWrapper);
        if (user == null) {
            return null;
        }
        UserDTO userDTO = new UserDTO();
        BeanUtils.copyProperties(user, userDTO); //属性复制
        return userDTO;
    }

    //获取所有用户列表
    @Override
    public List<UserDTO> listUsers() {
        List<User> userList = list();
        return userList.stream().map(user -> {
            UserDTO userDTO = new UserDTO();
            BeanUtils.copyProperties(user, userDTO);
            return userDTO;
        }).collect(Collectors.toList());
    }

    /**
     * 辅助补充模块
     * 用于上述方法 提供抽离出来复用的功能
     */
    //根据username 查询是否存在要求name唯一
    public boolean existsByUsername(String username) {
        return count(new QueryWrapper<User>().eq("username", username)) > 0;
    }
}
